কোনো যন্ত্রকে দিয়ে একটি বাস্তব সমস্যাকে সমাধানের জন্য চমৎকার একটি উপায় হলো প্রোগ্রাম ডিজাইন করা। যন্ত্রকে আমাদের সমাধানের ধাপগুলো বোঝানোর জন্য প্রথমে দরকার যন্ত্র বুঝতে পারে এমন যে কোনো একটি প্রোগ্রামিং ভাষায় পুরো প্রোগ্রামটি ডিজাইন করা। তাহলে ওই প্রোগ্রাম অনুসরণ করে যন্ত্র সেই অনুযায়ী কাজ করতে পারে। এই শিখন অভিজ্ঞতায় আমরা দেখব একটি সমস্যা যদি বারবার ঘটে বা বারবার সমাধান করার দরকার হয় তাহলে সেটি আমরা প্রোগ্রামিংয়ের মাধ্যমে কীভাবে সমাধান করতে পারি। এই অভিজ্ঞতায় আমরা প্রোগ্রামিংয়ের কাজ করা শুরু করব এবং প্রোগ্রামিং ব্যবহার করে কীভাবে সমস্যা সমাধান করে তার উপযোগিতা যাচাই করা যায় সেটি নিয়ে দলীয়ভাবে কাজ করব।
কম্পিউটারকে যেকোনো নির্দেশ দিতে গেলে কম্পিউটার বুঝতে পারে এমন ভাষায় নির্দেশ লিখতে হয়। কম্পিউটারসহ যেকোনো ইলেক্ট্রনিক ডিভাইস শুধুমাত্র ০ আর ১ কে বুঝতে পারে। কিন্তু শুধু ০ আর ১ দিয়ে নিজেদের নির্দেশগুলো লিখে ফেলাও আমাদের জন্য কঠিন। আমরা মানুষরা যেসব ভাষা ব্যবহার করি, সেগুলো শুধুমাত্র ০ আর ১ দিয়ে তৈরি নয়। তাহলে কম্পিউটারের সাথে কীভাবে আমরা যোগাযোগ করব? এমন কিছু ভাষা আছে, যেখানে ওই ভাষার রীতিনীতি অনুসরণ করে নির্দেশ লিখলে কম্পিউটার সেই ভাষাকে সহজেই নিজের বোঝার উপযোগী হিসাবে রূপান্তর করে নিয়ে নির্দেশগুলো বুঝতে পারে। এই ভাষাগুলোকে বলা হয় প্রোগ্রামিং ভাষা। মানুষ নিজেদের মধ্যে কথা বলার জন্য বাংলা, ইংরেজি, ফ্রেঞ্চ, ল্যাটিন, স্প্যানিশ ইত্যাদি কতরকমের ভাষা ব্যবহার করে! ঠিক তেমনই অনেক রকম প্রোগ্রামিং ভাষা আছে। যেমন সি, সি++, পাইথন, জাভা ইত্যাদি।
আমরা এরকম যেকোনো একটি প্রোগ্রামিং ভাষা শিখলে সেই ভাষার মাধ্যমে কম্পিউটারকে প্রয়োজনমত
বিভিন্ন নির্দেশ দিতে পারব। আমাদের কম্পিউটারের একটি সফটওয়্যার অ্যাপ্লিকেশনে প্রথমে আমরা নির্দিষ্ট কোনো প্রোগ্রামিং ভাষায় নির্দেশগুলো লিখে ফেলব। কম্পিউটারে এমন একটি রূপান্তর ব্যবস্থা থাকে যা সেই প্রোগ্রামিং ভাষার নির্দেশগুলোকে মেশিন কোডে রূপান্তর করে।
মেশিন কোড কি? মূলত ০ আর ১ এর সমন্বয়ে তৈরি বাইনারি কোডকেই মেশিন কোড বলা হয়, যা আমাদের কম্পিউটার বুঝতে পারে। এই রূপান্তরের ফলে আমাদের নির্দেশগুলো কম্পিউটার বুঝতে পারবে এবং সেই নির্দেশ অনুসরণ করে একটি কাজ সম্পন্ন করতে পারবে।
কম্পিউটারে থাকা প্রোগ্রামিং ভাষার রূপান্তর ব্যবস্থা আবার দুই রকমের হতে পারে-
ক) কিছু রূপান্তর ব্যবস্থায় আমরা যতগুলো নির্দেশ দিব, যদি নির্দেশগুলো নির্ভুল হয় তাহলে সবগুলো নির্দেশ একসাথে মেশিন কোডে রূপান্তর হবে। এই রূপান্তর ব্যবস্থাকে বলা হয় কম্পাইল (Compile) করা। আর যে সফটওয়্যার রূপান্তর করল, সেই রুপান্তরকারী হচ্ছে একটি কম্পাইলার (Compiler)। তবে কম্পাইলার যদি পুরো নির্দেশের কোথাও ভুল পায়, তাহলে রূপান্তর করতে পারে না। সবগুলো নির্দেশ নির্ভুল দিলে তখনই রুপান্তরের কাজটি করতে পারে।
খ) কিছু রূপান্তর ব্যবস্থায় আমরা যত নির্দেশই দেই না কেন, সব একসাথে রূপান্তর হবে না। একটি একটি করে নির্দেশ ধারাবাহিকভাবে রূপান্তর হতে থাকবে। এই রূপান্তর ব্যবস্থাকে বলা হয় ইন্টারপ্রেট (In- terprete) করা। আর যে রূপান্তর কাজটি করছে তাকে বলা হয় ইন্টারপ্রেটার (Interpreter) ইন্টারপ্রেটার একটি একটি করে নির্দেশ রূপান্তর করতে থাকবে। কোনো নির্দেশে ভুল পেলে সেই নির্দেশে আসার পর থেমে যাবে।
এবারে নিচের ছকে সঠিক অপশনে টিক চিহ্ন দেই-
প্রোগ্রামিং ভাষার বিবরণ | রূপান্তর ব্যবস্থা | |
কম্পাইলার | ইন্টারপ্রেটার | |
সি প্রোগ্রামিং ভাষায় আমরা যতগুলো নির্দেশ দিব সব একসাথে রুপান্তরিত হবে। |
|
|
পাইথন প্রোগ্রামিং ভাষায় আমরা যতগুলো নির্দেশ দিব একটি একটি করে রূপান্তরিত হবে। |
|
|
কিন্তু এই যে অজস্র প্রোগ্রামিং ভাষা আছে, এরমধ্যে কোনটি আমরা শিখব? যেকোনো একটি প্রোগ্রামিং ভাষা প্রথমে শিখলেই হলো। কারণ সব প্রোগ্রামিং ভাষার মূল গঠন একইরকমের, শুধু ভাষাগুলোতে বিভিন্ন নির্দেশ লেখার নিয়ম একটু ভিন্ন থাকে। যেমন সি প্রোগ্রামিং ভাষায় প্রতিটি নির্দেশ (স্টেটমেন্ট) শেষ হবার পর একটি সেমিকোলন চিহ্ন দিতে হয়, কিন্তু পাইথনে এই কাজ করতে হয় না। এরকম কিছু পার্থক্য থাকলেও চিন্তার কিছু নেই। তুমি একটি প্রোগ্রামিং ভাষা শিখে নিলে এরপর অন্য প্রোগ্রামিং ভাষাগুলো শেখা খুব সহজ হয়ে যাবে তোমার জন্য। আমরা এই অভিজ্ঞতার পাইথন নিয়ে কাজ শুরু করব। তুমি চাইলে পাইথন শেখার পর খুব সহজে অন্য প্রোগ্রামিং ভাষাও শিখে নিতে পারবে।
পাইথনের যাত্রা শুরু:
সহজে শেখার জন্য পাইথন বেশ মজার একটি প্রোগ্রামিং ভাষা।
পাইথন ভাষায় নির্দেশ লেখার জন্য সবার আগে আমাদের কিছু কাজ করতে হবে-
১। সবার আগে আমাদের পাইথন অ্যাপ্লিকেশন ডাউনলোড করে কম্পিউটারে ইনস্টল করতে হবে।
এই লিংকে চলে যাই- https://www.python.org/downloads/
এরপর সেখান থেকে সবচেয়ে সাম্প্রতিক ভার্সন নামিয়ে নেই।
২। অ্যাপ্লিকেশন নামানো হয়ে গেলে এটি ইনস্টল করে ফেলি। ইনস্টলের সময় নিচের ছবির মতো একটি উইন্ডো আমরা দেখতে পাব-
আমরা ইনস্টল উইন্ডোর নিচে থাকা অপশনগুলো ক্লিক করে টিক চিহ্ন দিয়ে দিব। তারপর Install Now অপশনে ক্লিক করব। এসময় ইনস্টল হবার অনুমতি চাইলে সেটাও অনুমতি দিয়ে দিব।
৩। এরপর আমাদের মেসেজ দেখাবে যে আমাদের সেটআপ সফল হয়েছে।
৪। পাইথন আমাদের কম্পিউটারে যুক্ত হলো। কিন্তু আমাদের আরেকটি সফটওয়্যার এপ্লিকেশন লাগবে যেখানে আমরা আমাদের নির্দেশ লিখে কম্পিউটারকে বুঝিয়ে দিব। সেজন্য এই লিংকে যাই - https:// thonny.org/
এই লিংক থেকে thonny সফটওয়্যারটি নামিয়ে নেই ও ইনস্টল করে ফেলি।
৫। thonny সফটওয়্যার এরপর চালু করি। নিচের মতো উইন্ডো দেখতে পাব-
৭। এবারে একটা কাজ করি। আমরা একটা প্রোগ্রাম লিখি, যার কাজ হবে আউটপুট হিসেবে Hello World! প্রিন্ট করা। আউটপুট হিসেবে কোনো কিছু প্রিন্ট করতে হলে print () ব্যবহার করতে হয়। আমরা যে টেক্সট প্রিন্ট করতে চাই, সেটা print () এর ভিতরে Single Quotation (' ') দিয়ে তারমধ্যে লিখব। তাহলে Hello World! প্রিন্ট করতে লেখি-
print('Hello World!")
এরপর রান বাটনে ক্লিক করলে নিচে আউটপুট হিসেবে Hello World! লেখা উঠবে।
৮। এবারে সেভ বাটনে ক্লিক করে প্রোগ্রামের একটি নাম দিয়ে ফাইলটি সেভ করি। তখন আমাদের ফাইলের নামও প্রদর্শন করবে প্রোগ্রামের উপরে।
কোনো টেক্সট প্রদর্শন করা কত সহজ দেখেছ? আমরা যেমন ইংরেজি টেক্সট প্রিন্ট করলাম, একইভাবে বাংলা লিখেও তুমি সেটা প্রিন্ট করতে পারবে।
যেমন, নিচের লাইন লিখে রান করে দেখ তো কী দেখা যায়-
print ('আমি এখন পাইথন শিখছি')
তুমিও কী এমন বিভিন্ন টেক্সট প্রদর্শন করতে পারবে?
নিচের ছকে কোনো টেক্সট প্রদর্শন করতে কি প্রোগ্রাম লিখতে হবে তা পূরণ কর-
যা টেক্সট প্রদর্শন করব | প্রোগ্রাম যা লিখতে হবে |
তোমার নিজের নাম ইংরেজিতে ও বাংলায় লিখে প্রিন্ট কর | |
I love Bangladesh | |
আমি ৯ম শ্রেণিতে পড়ি | |
প্রোগ্রামিং শিখতে ভারি মজা |
আগের সেশনে আমরা দেখলাম যেকোনো টেক্সট কত সহজে প্রিন্ট করা যায়। আমাদের প্রোগ্রামে যেকোনো সময় print () ফাংশন ব্যবহার করে এই কাজটি করা সম্ভব।
আবার কোনো তথ্য যদি প্রোগ্রামের ভিতর সঞ্চয় করতে হয় তাহলে আমরা ব্যবহার করতে পারব একটি ভ্যারিয়েবল (Variable)। ভ্যারিয়েবল হলো একটি বাক্সের মত, যার ভিতরে নির্দিষ্ট একটি তথ্য জমা রাখা যায়। আবার ভ্যারিয়েবল শব্দটির অর্থ পরিবর্তনশীল। মানে আমরা চাইলে প্রোগ্রামে একটি লাইনে ভ্যারিয়েবলের মধ্যে একটি তথ্য জমা রাখার পর অন্য লাইনে সেই তথ্য পরিবর্তন করে ভিন্ন আরেকটি তথ্য জমা রাখতে পারি।
আমাদের সবার তো একটা নির্দিষ্ট নাম আছে তাই না? এই নাম দিয়ে সবাই আমাদের চিনতে পারে। একইভাবে প্রতিটি ভ্যারিয়েবলের একটি নির্দিষ্ট নাম দিতে হয়, যে নাম দিয়ে পুরো প্রোগ্রামে আমরা ভ্যারিয়েবলটি চিনতে পারব ও ব্যবহার করতে হবে।
যেমন, আমরা যদি চাই number নামে একটি ভ্যারিয়েবল তৈরি করব, যেখানে ভ্যারিয়েবলের মান হিসেবে 7 জমা রাখতে চাই। তাহলে আমরা লিখব-
number = 7
তবে ভ্যারিয়েবলের নাম দেওয়ার সময় আমাদের কিছু দিক খেয়াল রাখতে হবে-
১। প্রথমত ভ্যারিয়েবলের নাম সবসময় একটি শব্দ হবে। অর্থাৎ একাধিক শব্দ দিয়ে আমরা ভ্যারিয়েবলের নাম লিখতে পারব না। তবে চাইলে দুটি শব্দের মধ্যে থাকা স্পেসগুলো বাদ দিয়ে তাদের একটি শব্দ হিসেবে ভ্যারিয়েবলের নাম দেওয়া যাবে। আবার চাইলে দুটি শব্দের মধ্যে থাকা স্পেস বাদ দিয়ে তাদের মধ্যে একটি আন্ডারস্কোর (১) চিহ্ন দিয়েও ভ্যারিয়েবলটির নামকরণ করা যাবে।
ভ্যারিয়েবলের সঠিক নামকরণ | ভ্যারিয়েবলের ভুল নামকরণ |
MyVariable | My Variable |
this_variable_is_cool | this variable is cool |
২। একটি ভ্যারিয়েবলের নামের প্রথম অক্ষর অবশ্যই a-z অথবা A-Z অথবা আন্ডারস্কোর (_) হতে হবে। প্রথম অক্ষর কোন সংখ্যা (0-9) বা অন্য কোনো প্রতীক চিহ্ন (যেমন বা ইত্যাদি) হতে পারবে না। প্রথম অক্ষরের পর বাকি অক্ষরগুলোতে যেকোনো সংখ্যা (0-9) বা a-z বা A-Z বা আন্ডারস্কোর (_) ব্যবহার করা যাবে। তবে ভ্যারিয়েবলের নামে অন্য কোনো প্রতীক চিহ্ন যেমন @.$. %, ইত্যাদি ব্যবহার করা যাবে না।
ভ্যারিয়েবলের সঠিক নামকরণ | ভ্যারিয়েবলের ভুল নামকরণ |
z1yan | z!yan |
a | 8a |
_variable | Svariable |
My_namE | @My_name |
৩। পাইথন একটি কেস সেন্সেটিভ (Case Sensitive) প্রোগ্রামিং ভাষা। তাই একই অক্ষর ছোট হাতের ও বড়ো হাতের হলে পাইথন তাদের দুটি ভিন্ন ভ্যারিয়েবল হিসেবে বিবেচনা করবে।
যেমন, My_variable আর my_variable দুটি ভিন্ন ভ্যারিয়েবল হিসেবে বিবেচিত হবে। এবারে নিচের ছক থেকে কোনো ভ্যারিয়েবলের নামকরণ সঠিক হয়েছে এবংকোনো ভ্যারিয়েবলের নামকরণ ভুল হয়েছে সেটি শনাক্ত কর-
ভ্যারিয়েবলের নাম | সঠিক/ভুল |
Bd_capital | |
8class_Section_C | |
digital_T3chnologY | |
Ch@tta0gram | |
tiiigeeeeer | |
Robotics learning |
আবার, ভ্যারিয়েবলের মধ্যে তথ্য জমা করার জন্য আমরা = চিহ্ন ব্যবহার করি। একে বলা হয় ভ্যালু অ্যাসাইন করা।
ধরি, আমাদের একটি ভ্যারিয়েবল আছে count
count এর মান যদি 5 রাখতে চাই, তাহলে প্রোগ্রামে আমরা লিখব-
count = 5
এরপর এই মানটি প্রিন্ট করতে লিখব,
print(count)
তাহলে নিচের প্রোগ্রামটি আমরা যদি লিখে রান করি,
count=5 print(count) |
আমরা নিচের মতো আউটপুট পাব-
অর্থাৎ, count ভ্যারিয়েবলের যে মান, সেটি প্রিন্ট করা হয়েছে।
আবার, একটি ভ্যারিয়েবলের মান পুরো প্রোগ্রামে একাধিকবার পরিবর্তন করা সম্ভব। ভ্যারিয়েবলের মধ্যে নতুন মান এসাইন করা হলে আগের মান মুছে যায় ও সর্বশেষ এসাইন করা মানটি জমা থাকে।
নিচের প্রোগ্রামটি যদি রান করি, আউটপুট তাহলে কি হবে?
value_now=1 print(value_now) value_now 2 print(value_now) value_now-3 print(value_now) |
এই প্রোগ্রামের আউটপুট নিচের ঘরে লিখে ফেলি-
|
লক্ষ করি, উপরের প্রোগ্রামে একই ভ্যারিয়েবল value_now কে আমরা বারবার প্রিন্ট করেছি। কিন্তু একেক সময়ে ভ্যারিয়েবলটির ভেতরে জমা থাকা তথ্য ভিন্ন ছিল, তাই প্রিন্ট করার পর ভিন্ন মান পেয়েছি।
আবার, ভ্যারিয়েবলের মধ্যে সবসময় একইরকম তথ্য বা ডেটা আমরা জমা রাখি না। যে তথ্য জমা রাখব সেটি কেমন তথ্য, তার উপর ভিত্তি করে কয়েকটি তথ্যের প্রকারভেদ বা ডেটাটাইপ (Data Type) আছে
ক) int: ভ্যারিয়েবলে আমরা পূর্ণসংখ্যা জমা রাখতে পারি। পূর্ণসংখ্যাকে ইংরেজিতে integer number (ইন্টিজার নাম্বার) বলা হয়। তাই ভ্যারিয়েবলে পূর্ণসংখ্যা জমা রাখলে তার ডেটাটাইপকে বলা হয় int. এখানে int হলো integer এর সংক্ষিপ্ত রূপ। এমন একটি উদাহরণ হলো-
a=5
খ) float: ভ্যারিয়েবলে আমরা দশমিক যুক্ত সংখ্যা বা ভগ্নাংশ জমা রাখতে পারি। এমন সংখ্যাকে ইংরেজিতে floating number (ফ্লোটিং নাম্বার) বলা হয়। তাই ভ্যারিয়েবলে ভগ্নাংশ বা দশমিক যুক্ত সংখ্যা জমা রাখলে তার ডেটাটাইপকে বলা হয় float, এখানে float হলো floating এর সংক্ষিপ্ত রূপ। এমন একটি উদাহরণ হলো-
a=5.09
গ) str: ভ্যারিয়েবলে যদি কোনো টেক্সট বা অক্ষর জাতীয় তথ্য জমা রাখতে চাই, তাহলে সেটিকে string (স্ট্রিং) বলা হয়। আর এ ধরনের তথ্য str ডেটাটাইপের অন্তর্ভুক্ত হয়। এখানে str হলো string এর সংক্ষিপ্ত রূপ।
আমরা ভ্যারিয়েবলে যে টেক্সট রাখতে চাই তা (Single Quotation) এরমধ্যে জমা রাখব।
এমন উদাহরণ নিচে দেখি-
a='c'
b-This is a string variable'
ঘ) bool: কোনো ভ্যারিয়েবলে যদি সত্য (True) অথবা মিথ্যা (False) কে তথ্য হিসেবে জমা রাখতে চাই, তাহলে সেটি হবে বুলিয়ান (boolean) তথ্য। এধরনের তথ্যকে বলা হয় bool ডেটাটাইপের তথ্য। এখানে bool হলো boolean এর সংক্ষিপ্ত রূপ। bool ডেটাটাইপে দুটি মাত্র তথ্য রাখা যায়- True ও False
এমন উদাহরণ নিচে দেখি-
a=True
আমরা চারটি ডেটাটাইপ জানলাম int, float, str এবং bool
এগুলো হলো পাইথনে প্রধান চারটি ডেটাটাইপ। এছাড়াও আরও কিছু ডেটাটাইপ আছে, যদি কখনো প্রোগ্রাম লেখার সময় প্রয়োজন হয় আমরা সেগুলো সম্পর্কে তখন জানতে পারব। ভ্যারিয়েবলের মধ্যে আমরা যে তথ্য জমা রাখি, সেটা জমা হয় কম্পিউটারের মেমোরিতে। তাই যখন আমরা প্রোগ্রামের মধ্যে কোথাও ভ্যারিয়েবল ব্যবহার করব, কম্পিউটার মেমোরিতে জমা থাকা ভ্যারিয়েবলটির মান তখন প্রোগ্রামে ব্যবহার হবে।
মজার জিনিস হলো, কোনো ভ্যারিয়েবলের ডাটটাইপ কোনটি, সেটি সহজেই বের করা যায় type() এর মাধ্যমে। আমরা যদি একটি ভ্যারিয়েবলকে type() ফাংশনের ভিতরে রেখে প্রিন্ট করি, তাহলে ওই ভ্যারিয়েবলের ডেটাটাইপ পেয়ে যাব।
যেমন নিচের প্রোগ্রামটি যদি রান করি,
my_variable 23.07 print(my_variable) print(type(my_variable)) |
আউটপুট পাব নিচের মতো-
23.07 <class 'float'> |
অর্থাৎ, আমরা বুঝতে পারলাম my_variable নামক ভ্যারিয়েবলের কাছে জমা করা তথ্য 23.07 এবং এটি একটি float ডেটাটাইপের অন্তর্ভুক্ত ভ্যারিয়েবল।
এবারে আমরা বাসায় নিচের ভ্যারিয়েবলগুলোর ডেটাটাইপ বের করার চেষ্টা করি-
প্রোগ্রাম | ডেটাটাইপ |
Ab = True | |
my_value='Variable have some data types' | |
f=23 | |
status_is 'False' | |
number_now=12.789 | |
section = 'b' |
আগের সেশনে আমরা ভ্যারিয়েবলে তথ্য এসাইন করা শুরু করেছি। আমরা যদি প্রোগ্রামের ব্যবহারকারীর থেকে একটি তথ্য ইনপুট নিতে চাই তাহলে কি করব? কাজটি করা খুবই সহজ input () ব্যবহার করে।
আমরা যদি নিচের মতো লেখি-
my_input input ()
তাহলে my_input ভ্যারিয়েবলটি আমাদের থেকে একটি ইনপুট গ্রহণ করবে। তবে, input () প্রোগ্রামের ভিতরে ইনপুট হিসেবে কোনো সংখ্যা, অক্ষর ইত্যাদি যেটাই গ্রহণ করুক না কেন, সেটিকে str ডেটাটাইপে গ্রহণ করবে।
চল একটি কাজ করি, একটি ভ্যারিয়েবল ইনপুট নিয়ে সেটি প্রিন্ট করি। এমন একটি প্রোগ্রাম লেখা খুব সহজ। নিচের মতো করে একটি প্রোগ্রাম লিখে রান করি-
my_input = input() print(my_input) print(type(my_input)) |
এই প্রোগ্রামের আউটপুট তাহলে কি হবে? তুমি যা ইনপুট দিবে সেটিই কিন্তু আউটপুট হিসেবে প্রিন্ট হবে। কিন্তু খেয়াল করে দেখ, তুমি কোনো পূর্ণসংখ্যা বা ভগ্নাংশ ইনপুট দিলেও সেটির ডেটাটাইপ হিসেবে str প্রিন্ট হচ্ছে। তার মানে, তুমি যে তথ্যই জমা দাও, input() তথ্যটিকে একটি স্ট্রিং হিসাবে গ্রহণ করবে। কিন্তু তুমি যদি চাও ইনপুটটি যেন স্ট্রিং হিসেবে জমা না হয়ে ইন্টিজার বা ফ্লোট ডেটা হিসেবে জমা হয় তাহলে তোমাকে তথ্যটি ওই নির্দিষ্ট ডেটাটাইপে রূপান্তর করে নিতে হবে। একে বলা হয় টাইপ কাস্টিং (Type Casting) করা। আমাদের চারটি প্রধান ডেটাটাইপের মধ্যে int, float, str ও bool এ রূপান্তর করা সহজ।
ডেটাটাইপ | ওই ডেটাটাইপে রূপান্তর করতে লিখব |
int | int() |
float | float() |
str | str() |
bool | bool() |
আমরা যখন কোনো তথ্য ইনপুট নিচ্ছি, input() ফাংশনকে সরাসরি int ডেটাটাইপে রূপান্তর করা যাবে নিচের মতো প্রোগ্রাম করে-
my_input=int(input()) print(my_input) print(type(my_input)) |
প্রোগ্রামটি রান করার পর খেয়াল করে দেখো int(input()) লেখার কারণে my_input ভ্যারিয়েবলটি int ডেটা টাইপে রূপান্তরিত হচ্ছে।
তুমি কি একইভাবে my_input ভ্যারিয়েবলকে float ডেটা টাইপে রূপান্তর করার একটি প্রোগ্রাম লিখতে পারবে? নিচের ঘরে এমন একটি প্রোগ্রাম লিখে ফেল-
|
আবার, আমরা চাইলে একটি তথ্য ইনপুট নেবার সময় নির্দিষ্ট কমান্ড বা নির্দেশনা দিয়ে দিতে পারব। সেজন্য input() এর ভিতরে " দিয়ে সেই কমান্ড লিখে দিতে পারি। যেমন, আমরা যদি লেখি-
my_input input('Provide a Sentence as an input:') print(my_input) print(type(my_input)) |
তাহলে প্রোগ্রামটি রান করার পর প্রথমে আমাদের কাছে একটি ইনপুট কমান্ড প্রদর্শন করবে-
Provide a Sentence as an input:
তারপর আমরা আমাদের ইনপুট দিলে সেই ইনপুট প্রিন্ট করবে এবং ডেটা টাইপ হিসেবে str দেখাবে।
আবার আমরা যদি চাই, আমাদের ইনপুট নেওয়া তথ্য প্রিন্ট করার আগে ও পরে আরও শব্দ বা বাক্য প্রিন্ট করতে পারি। এজন্য যে শব্দ বা বাক্য প্রিন্ট করতে চাই, সেটি print() এর মধ্যে" এর ভিতরে লিখব ও তারপর , (কমা) চিহ্ন দিয়ে আমাদের ভ্যারিয়েবল লিখে দিব।
যেমন, আমরা যদি নিচের প্রোগ্রামটি লেখি,
my_input = int(input('Write down an integer number:')) print('This is your integer number: ', my_input) |
তাহলে নিচের মতো আউটপুট দেখতে পাব-
এখানে খেয়াল করে দেখো, print() এর মধ্যে যখন আমরা টেক্সট প্রিন্ট করছি, তখন সেটি'' বা একক উদ্ধৃতির ভিতরে লিখেছি। আর যখন আমরা একটি ভ্যারিয়েবল প্রিন্ট করেছি, সেটিকে কোন'' বা একক উদ্ধৃতির মধ্যে না রেখে সরাসরি ভ্যারিয়েবলটির নাম লিখেছি।
এবারে, নিচের প্রোগ্রামটি লেখার চেষ্টা করি-
সমস্যা - এমন একটি প্রোগ্রাম ডিজাইন কর, যা প্রথমে একটি ভ্যারিয়েবলকে পূর্ণসংখ্যা হিসেবে ইনপুট গ্রহণ করবে। এরপর আরেকটি ভ্যারিয়েবলকে দশমিক যুক্ত সংখ্যা ইনপুট হিসেবে গ্রহণ করবে। এরপর সংখ্যা দুটি প্রিন্ট করবে এবং তাদের ডাটাটাইপ প্রিন্ট করবে। হিন্ট- ইনপুট দুটিকে অবশ্যই যথাক্রমে int ও float হিসেবে টাইপ কাস্টিং করে নিতে হবে।
|
সমাধান-
|
আগের সেশনে আমরা ইনপুট নেওয়া শিখেছি input() ফাংশন ব্যবহার করে। আমরা চাইলে দুটি সংখ্যা ইনপুট নিয়ে তাদের মধ্যে গাণিতিক অপারেশন (Arithmetic Operation) করতে পারি।
এক্ষেত্রে নিচের অপারেটরগুলো ব্যবহার করতে পারি আমরা সহজেই-
অপারেটর | কাজ |
+ | এটি যোগ (Addition) অপারেটর। এই অপারেটর ব্যবহার করে অপারেটরটির দুপাশে থাকা দুটি ভ্যারিয়েবলের যোগফল বের করা যাবে। |
- | এটি বিয়োগ (Subtraction) অপারেটর। এই অপারেটর ব্যবহার করে অপারেটরটির দুপাশে থাকা দুটি ভ্যারিয়েবলের বিয়োগফল বের করা যাবে। |
* | এটি গুণ (Multiplication) অপারেটর। এই অপারেটর ব্যবহার করে অপারেটরটির দুপাশে থাকা দুটি ভ্যারিয়েবলের গুণফল বের করা যাবে। |
/ | এটি ভাগ (Division) অপারেটর। এই অপারেটর ব্যবহার করে অপারেটরটির বামপাশে থাকা ভ্যারিয়েবলকে ডানপাশে থাকা ভ্যারিয়েবল দিয়ে ভাগ করে ভাগফল বের করা যাবে। |
% | এটি মডুলো (modulo) অপারেটর। এই অপারেটর ব্যবহার করে অপারেটরটির বামপাশে থাকা ভ্যারিয়েবলকে ডানপাশে থাকা ভ্যারিয়েবল দিয়ে ভাগ করে ভাগশেষ বের করা যাবে। |
আমরা যদি দুটি সংখ্যা ইনপুট নিয়ে তাদের যোগফল প্রিন্ট করতে চাই, আমাদের জন্য সহজ হবে প্রথমে সুডো কোড তৈরি করে, তারপর সুডো কোডের ধাপগুলো অনুসরণ করে একটি প্রোগ্রাম ডিজাইন করি। আমাদের দুটি সংখ্যা ইনপুট নিয়ে যোগফল বের করার সুডো কোড নিচের মতো হবে-
ক = প্রথম ইনপুট নেই খ = দ্বিতীয় ইনপুট নেই গ = ক+খ গ সংখ্যাটি প্রিন্ট করি |
আমরা এর আগে একটি পূর্ণসংখ্যা কীভাবে ইনপুট নিতে হয় সেটি দেখেছি। কোনো ভ্যারিয়েবল প্রিন্ট কীভাবে করতে হয় সেটিও দেখেছি। চল, এখন দেখি কীভাবে আমরা প্রোগ্রাম ডিজাইন করে দুটি পূর্ণসংখ্যা ইনপুট নিয়ে তাদের যোগফল প্রিন্ট করতে পারি-
num1 = int(input("Enter the first integer:')) num2 = int(input("Enter the second integer:')) result = num1 + num2 print("The sum of, numl, 'and', num2,'is', result) |
তুমি কি প্রোগ্রামের লাইনগুলো বুঝতে পারছ?
num1 = int('input("Enter the first integer:'))
এই লাইনে আমরা একটি ইনপুট নিয়েছি input() ব্যবহার করে। এসময় ইনপুটের মধ্যে আমরা কমান্ড দিয়ে দিয়েছি যে আমরা একটি ইন্টিজার বা পূর্ণ সংখ্যাকে ইনপুট হিসাবে চাচ্ছি। ইনপুট তো সবকিছু স্ট্রিং হিসাবে ইনপুট নেয়, তাই না? একারণে ইনপুটকে টাইপ কাস্টিং করে পূর্ণসংখ্যায় রূপান্তর করতে int() ব্যবহার করেছি। এরপর এই পূর্ণসংখ্যা ইনপুট পেলে সেটি জমা করেছি num। ভ্যারিয়েবলের ভিতরে।
একইভাবে পরের লাইনে লিখেছি
num2 = int(input('Enter the second integer:'))
এই লাইনে একইভাবে num2 ভ্যারিয়েবলে দ্বিতীয় পূর্ণসংখ্যাটি ইনপুট নিয়েছি।
এরপর আমাদের সংখ্যা দুটি যোগ করে আরেকটি ভ্যারিয়েবল result এর মধ্যে আমরা জমা রাখব। এজন্য আমরা পরের লাইনে লিখেছি-
result = num1 + num2
সবশেষে আমরা সংখ্যা দুটির যোগফল প্রিন্ট করেছি এভাবে-
print("The sum of, num1, 'and', num2,'is', result)
কত সহজ ও মজার না যোগ করার এই প্রোগ্রামটি?
উপরের প্রোগ্রামটি রান করলে তুমি দুটি সংখ্যা ইনপুট দিতে পারবে পছন্দমতো এবং তারপর সংখ্যা দুটির যোগফল বের করতে পারবে। নিচের ছবিতে আমরা এমন দুটি সংখ্যা ইনপুট দিয়ে যোগফল বের করার উদাহরণ দেখতে পাচ্ছি
তুমি কি একইভাবে গুণ করার একটি প্রোগ্রাম ডিজাইন করতে পারবে?
প্রথমে নিচের ছকে দুটি সংখ্যা ইনপুট নিয়ে তাদের গুণফল প্রিন্ট করার একটি সুডো কোড লিখে ফেলো-
|
এবারে তোমার তৈরি করা সুডো কোড অনুসরণ করে একটি প্রোগ্রাম ডিজাইন কর নিচের ছকে এবং সেটিকে রান করে দেখ।
|
আমরা এভাবে দুটি সংখ্যা ইনপুট নিয়ে তাদের যোগফল, বিয়োগফল, গুণফল, ভাগফল এবং ভাগশেষ বের করতে পারব খুব সহজেই একটি প্রোগ্রাম ডিজাইন করে।
গত সেশনগুলো থেকে আমরা পাইথন প্রোগ্রামের প্রাথমিক ধারণা পেয়েছি এবং ভ্যারিয়েবল সম্পর্কে জেনেছি। এবার আমরা পাইথন প্রোগ্রামে কীভাবে বিভিন্ন শর্ত ব্যবহার করা যায় সেই সম্পর্কে জানবো। এই অভিজ্ঞতার শেষে গিয়ে আমরা যে বিভিন্ন সমস্যার সমাধান করব তার প্রস্তুতি হিসেবেই কিন্তু আমরা পাইথন প্রোগ্রামিং এর এইসব কাজগুলো শিখছি। তাহলে চল আজকের সেশনটি শুরু করি।
অনেক সময় বাস্তব জীবনে এমন কিছু ঘটনা ঘটে যেখানে ফলাফল কোনো শর্তের উপর নির্ভরশীল।
ধরি আমাদের বিদ্যালয়ে একটি ক্রীড়া প্রতিযোগিতা অনুষ্ঠিত হচ্ছে। ১০০ মিটার দৌড়ে সবার আগে যে আসবে সে হবে প্রথম। এরপর যে আসবে সে হবে দ্বিতীয়। তারপর আসলে হবে তৃতীয়। আর এরপর যারা আসবে তাদের অনুপ্রেরণা দেওয়া হবে পরের বার আরও ভালো করার জন্য। তাহলে এখানে কিন্তু শর্তের উপস্থিতি আছে। শর্ত অনুযায়ী সবাই কিন্তু প্রথম হতে পারবে না বা সেরা তিনে আসতে পারবে না।
এখানে বিদ্যমান শর্তকে নিচের মত লেখা যায়-
যদি সবার আগে দৌড় শেষ করি : তাহলে প্রথম হতে পারব
অথবা যদি এরপরে দৌড় শেষ করি : তাহলে দ্বিতীয় হতে পারব
অথবা যদি তারপরে দৌড় শেষ করি : তাহলে তৃতীয় হতে পারব
অন্যথায় : পরের বার আরও ভালো করে চেষ্টা করব
এই যে আমরা লিখলাম যদি, এটাকে প্রোগ্রামিং করার সময় লেখা হয় ইংরেজিতে if ।
প্রোগ্রামে আমরা if লিখে কোনো শর্ত দিলে প্রোগ্রাম যাচাই করবে সেই শর্ত পূরণ হয়েছে কি না। যদি শর্ত পূরণ হয়, তাহলে if এর অধীনে লেখা কাজগুলো সম্পন্ন করবে।
যেমন, আমরা যদি এমন একটি প্রোগ্রাম লেখি-
if my_variable -5:
print('Value is five')
এর অর্থ হল, if দিয়ে আমরা একটি শর্ত দিয়েছি যে my_variable এর মান 5 এর সমান হতে হবে। শুধুমাত্র তাহলেই if এর শর্ত পূরণ হবে। আর শর্ত পূরণ হলে তখন প্রিন্ট করে আমরা জানিয়ে দিব Value is five
এখানে একটি বিষয় খেয়াল রাখতে হবে, আমরা যখন কোনো ভ্যারিয়েবলের মধ্যে কোনো তথ্য জমা রাখতে চাই, তখন আমরা এভাবে লিখি-
my_variable = 5
কারণ = হল একটি এসাইনমেন্ট অপারেটর, যা একটি মানকে এসাইন করে বা ভ্যারিয়েবলে জমা রাখে।
অপরদিকে আমরা যখন কন্ডিশনের শর্ত পূরণ হয়েছে কি না যাচাই করব, তখন একটি চিহ্ন দিলে শর্ত যাচাই করা যাবে না। তখন দিতে হবে== চিহ্ন। == চিহ্ন এর মানে হল এই চিহ্নের বামপাশে ও ডানপাশে থাকা মান সমান কি না সেটি যাচাই করা হচ্ছে।
তার মানে আমরা যখন লিখেছি my_variable 5 তখন যাচাই করা হচ্ছে my_variable এর মান 5 এর সমান কি না। my_variable এর মান 5 এর সমান হলেই শুধুমাত্র if এর শর্ত পূরণ হবে ও তখন: চিহ্নের পরে লেখা নির্দেশ মেনে কাজ করবে।
আবার if এর শর্ত যদি পূরণ না হয়, তখন আরও ভিন্ন কোনো শর্ত আছে কি না সেটি খুঁজতে থাকবে। এজন্য আমরা আরও ভিন্ন শর্ত দেবার জন্য লিখব clif
আমরা চাইলে একাধিক clif এর শর্ত দিতে পারি।
যেমন নিচের প্রোগ্রামটি দেখি-
my_variable = 3
if my_variable-5:
print("Value is five')
elif my_variable = 4:
print('Value is four')
elif my_variable - 3:
print("Value is three')
এখানে সবার আগে if এর শর্ত যাচাই হবে যে my_variable এর মান 5 কি না। যদি মান মিলে যায় তাহলে if এর কাজ সম্পন্ন করবে, কিন্তু পরের শর্তগুলো আর যাচাই করবে না।
আর যদি if এর শর্ত পূরণ না হয়, তাহলে পরের elif এ চলে যাবে এবং যাচাই করবে my_variable এর মান 4 কি না। যদি শর্ত এবার পূরণ হয়ে যায় তাহলে পরের elif' আর যাচাই করবে না। কিন্তু এবারও যদি elif এর শর্ত পূরণ না হয় তাহলে পরের clif এর কাছে চলে যাবে। এভাবে শর্ত যাচাই চলতে থাকবে শর্ত পূরণ না হওয়া পর্যন্ত অথবা সব শর্ত যাচাই শেষ না হওয়া পর্যন্ত। তবে খেয়াল করে দেখ, if my_variable = 5: লেখার পর পরের লাইনে আমরা if এর ঠিক নিচ বরাবর থেকে আবার পরের অংশ লেখা শুরু করি নি। আমরা কিছুটা ফাঁকা রেখেছি। আসলে এখানে চারটি স্পেস সমপরিমাণ ফাঁকা রেখে তারপর কোড লেখা হয়েছে। এটাকে বলা হয় ইনডেনটেশন (Indentation)। এটা পাইথনে খুব গুরুত্বপূর্ণ। যদি আমরা যথাযথ ইনডেনটেশন না দেই তাহলে পাইথনের কোড রান হবে না, আমরা এরর দেখতে পাব। যখনই if এর অধীনে কোনো লাইন আমরা লেখব, সেগুলো অবশ্যই চারটি ফাঁকা স্পেস রেখে কাজ করবে। এজন্য আমরা লিখেছিলাম
if my_variable=5:
print('Value is five')
এটা না লিখে যদি লিখতাম- if my variable-5:
print('Value is five')
তাহলে সেটা ভুল হত ও কোড কাজ করত না।
আবার একইভাবে clif এর সময়েও ইনডেনটেশন অনুসরণ করতে হয়। তাই আমরা লিখেছিলাম-
elif my_variable = 4:
print('Value is four')
আবার একটি প্রোগ্রামে কোনো শর্তই যদি পূরণ না হয় তাহলে কি করব? সেজন্য আমরা চাইলে একটি else রাখতে পারি। কোনো শর্তই পূরণ না হলে সেক্ষেত্রে else এর মধ্যে বলা কাজটি সম্পন্ন করবে।
যেমন, আমরা যদি নিচের প্রোগ্রাম লেখি my_variable = 2
if my_variable-5:
print('Value is five')
elif my_variable - 4:
print('Value is four')
elif my_variable - 3:
print('Value is three')
else:
print('No condition was true')
খেয়াল করে দেখি, else: লেখার পরেও আমাদের ইনডেনটেশন অনুসরণ করতে হয়েছে।
Thonny সফটওয়্যার আমরা পাইথন প্রোগ্রাম লিখলে নিজে নিজেই প্রয়োজনমত ইনডেনটেশন নিয়ে নিবে, আমাদের খুব একটা ভাবতে হবে না। কিন্তু কাগজে বা বইয়ে প্রোগ্রাম লেখার সময় অবশ্যই আমরা নিজেরা খেয়াল করে প্রয়োজন অনুসারে ইনডেনটেশন দিব।
চল এবার দেখি এমন একটি প্রোগ্রামের বিভিন্ন ধাপে কীভাবে আমরা শর্ত যাচাই করে আউটপুট বের করতে পারি। এজন্য এই প্রোগ্রামের জন্য নিচের ছক পুরণ করি
my_variable এর আসল মান কত?
|
প্রথম শর্ত যাচাই- my_variable এর মান কি 5? উত্তর হ্যাঁ হলে প্রিন্ট করব- Value is five এরপর থেমে যাই উত্তর না হলে পরের ধাপে চলে যাই |
দ্বিতীয় শর্ত যাচাই- my_variable এর মান কি 4? উত্তর হ্যাঁ হলে প্রিন্ট করব- Value is four এরপর থেমে যাই উত্তর না হলে পরের ধাপে চলে যাই |
তৃতীয় শর্ত যাচাই- my_variable এর মান কি 3? উত্তর হ্যাঁ হলে প্রিন্ট করব- Value is three এরপর থেমে যাই উত্তর না হলে পরের ধাপে চলে যাই |
যদি কোনো শর্তই পূরণ না হয়, তাহলে else এর ভিতর থাকা কাজ করব। তাই প্রিন্ট করি No condition was true |
আমাদের চূড়ান্ত সিদ্ধান্ত -
|
এভাবে আমরা if, elif, else ব্যবহার করে বাস্তব জীবনের বিভিন্ন সমস্যা সমাধান করতে পারব।
এবারে পরের প্রোগ্রামগুলো দেখি ও ছকে প্রোগ্রামগুলোর আউটপুট লিখে ফেলি-
প্রোগ্রাম ১
running_time = 40 if running_time >= 60: print('Great! Have a healthy routine like this everyday') elif running_time >= 40: print('Good job! Keep running everyday') else: print('You need to run more everyday!") |
আউটপুট:
|
প্রোগ্রাম ২ today temperature = 15 if today temperature >= 30: print('It is very hot today!") elif today temperature >= 20: print("Temperature is tolerable today') else: print('It is very cold today!') |
আউটপুট:
|
৫ম সেশনে আমরা দেখেছি দুটি সংখ্যা ইনপুট নিয়ে কীভাবে তাদের যোগফল, বিয়োগফল ইত্যাদি বের করতে পারি।
কিন্তু এই কাজটি আমরা ভিন্ন ভিন্ন প্রোগ্রামে করেছি। অর্থাৎ যোগফল বের করার জন্য ভিন্ন প্রোগ্রাম, বিয়োগফল বের করার জন্য ভিন্ন প্রোগ্রাম এভাবে আমরা চিন্তা করেছি। কিন্তু ক্যালকুলেটরের কথা ভাবি।
কখনও কি আমরা দেখেছি একটা ক্যালকুলেটর আছে যা শুধুমাত্র যোগফল বের করতে পারে, কিন্তু কোনো বিয়োগফল বা গুণফল বের করতে পারে না? এভাবে ব্যবহার করতে গেলে তো আমাদের অনেকগুলো ক্যালকুলেটর লাগত!!! এটা তো কোনো ভালো সমাধান নয়। যদি একটা ক্যালকুলেটর বা ডিভাইসে আমরা যোগ, বিয়োগ, গুণ, ভাগ ইত্যাদি সবরকম হিসাবনিকাশ করতে পারি সেটা উত্তম তাই না?
একইভাবে এই কাজগুলো করার জন্য অনেকগুলো ভিন্ন প্রোগ্রাম থাকার চেয়ে একটি প্রোগ্রাম যদি থাকে, যেখানে আমরা সবগুলো কাজ একসাথে করতে পারি, সেটা বেশি ভালো হবে।
কাজেই আমরা এখন এমন একটি প্রোগ্রাম ডিজাইন করার চিন্তা করব, যেখানে একটি প্রোগ্রামেই এই সবগুলো কাজ করতে পারি।
আমরা যদি একটু খেয়াল করে দেখি ৫ম সেশনের প্রোগ্রাম কীভাবে করছিলাম?
আমরা প্রথমে দুটি সংখ্যা ইনপুট নিচ্ছিলাম। আমরা জানতাম সংখ্যাগুলো যোগ বা বিয়োগ বা গুণ কোনো কাজটি করতে চাই। তাই এরপর আমরা অন্য একটি ভ্যারিয়েবলে সেই হিসাবনিকাশ করছিলাম ও সবশেষে আমাদের হিসাবনিকাশের ফলাফল প্রিন্ট করছিলাম।
কিন্তু আমরা যখন একই প্রোগ্রামে যোগ, বিয়োগ ইত্যাদি অনেকগুলো কাজ করার ব্যবস্থা রাখব, আমাদের আরও একটি ইনপুট নিতে হবে, যে ইনপুটে জানাব এই মুহূর্তে কি যোগ করতে চাচ্ছি, নাকি বিয়োগ, নাকি গুণ নাকি ভাগ ইত্যাদি।
এই কাজটা করার জন্য নিচের মতো কোড লিখতে পারব-
op = input('Enter the arithmetic operator [+,-,*,/,%]:')
এই লাইনে আমরা একটি ভ্যারিয়েবল নিয়েছি op
op ভ্যারিয়েবলের মধ্যে আমরা ইনপুট নিয়েছি যোগ, বিয়োগ, গুণ, ভাগ ও মডুলাসের মধ্যে কোন কাজটি করতে চাই।
আমাদের কাছে যেহেতু বেশ কিছু অপশন আছে হিসাবনিকাশ করার জন্য, তাই প্রোগ্রামে একটি শর্ত (Condition) দিতে হবে। আমরা তো ইতোমধ্যে ৬ষ্ঠ সেশনে দেখেছি if, elif, else এর মাধ্যমে কীভাবে শর্ত যাচাই করতে হয় বিভিন্ন ধাপে।
চল একটি কাজ করি। এমন একটি সুডো কোড তৈরি করি, যেখানে আমরা প্রথমে ইনপুট হিসেবে দুটি সংখ্যা গ্রহণ করব ও একটি চিহ্ন ইনপুট নিব (যা দিয়ে বুঝতে পারব এখন যোগ, বিয়োগ, গুণ, ভাগ ও মডুলাসের মধ্যে কোনো কাজটি করতে চাচ্ছি)। তারপর শর্ত যাচাই করে সেই অনুযায়ী ফলাফল বের করব ও সবশেষে ফলাফল প্রিন্ট করব -
নিচের ছকে এমন একটি সুডোকোড লিখে ফেলি
ক = প্রথম সংখ্যা ইনপুট
|
তোমার সুডো কোডে নিশ্চয়ই শর্ত যাচাইয়ের ব্যবস্থা রেখেছ তাই না। প্রোগ্রাম ডিজাইনের সময় আমাদের অবশ্যই নিচের মতো শর্ত যাচাই করতে হবে-
if op = '+':
result = num1 + num2
elif op = '-':
result = num1 - num2
elif op = '*':
result = num1 * num2
elif op = '/:
result = num1/num2
elif op = 10%
result = num1% num2
else: print('Operator is not correct. Result can not be printed.")
প্রতিবারে এখানে যাচাই করা হচ্ছে op এর মান কোনো চিহ্নের সমান।
if op = '*':
result = num1 + num2
অর্থাৎ প্রথমে যাচাই করা হবে op এরমধ্যে আমরা ইনপুট দিয়েছি কি না। যদি শর্ত পূরণ হয়, তাহলে আমরা result ভ্যারিয়েবলের মধ্যে দুটি সংখ্যার যোগফল বের করব। আর যদি শর্ত পূরণ না হয়, পরের শর্তে চলে যাব। এভাবে আমাদের পুরো প্রোগ্রামটি রান হবে। আর যদি কোনো শর্তই পূরণ না হয়, তার মানে হচ্ছে আমরা সঠিক চিহ্ন ইনপুট দিতে পারিনি। তখন else এর ভিতর থাকা লাইনটি প্রিন্ট হবে।
এবারে আমরা যদি পুরো প্রোগ্রামটি লেখি, তাহলে সেটি নিচের অনুরুপ হবে-
খেয়াল করে দেখ তো তোমার সুডো কোডের সাথে এই প্রোগ্রামের কী কী মিল ও অমিল আছে?
তোমার সুডো কোডের সাথে এই প্রোগ্রামের একটি তুলনা নিচের ঘরে লিখে ফেলো -
|
উপরের প্রোগ্রাম রান করে একেকবার একেক ইনপুট দিলে কীরকম আউটপুট পাওয়া যায় সেটা কি বুঝতে পারছ? এরকম যাচাই করে নিচের ছকটি পূরণ করি-
num1 = 12 num2=8 op = * |
প্রথম শর্ত যাচাই- op এর মান কি + ? উত্তর হ্যাঁ হলে ইনপুট দেওয়া দুটি সংখ্যার যোগফল বের করি এরপর ফলাফল প্রিন্ট করি উত্তর না হলে পরের ধাপে চলে যাই |
দ্বিতীয় শর্ত যাচাই- op এর মান কি? উত্তর হ্যাঁ হলে ইনপুট দেওয়া দুটি সংখ্যার বিয়োগফল বের করি এরপর ফলাফল প্রিন্ট করি উত্তর না হলে পরের ধাপে চলে যাই |
তৃতীয় শর্ত যাচাই- op এর মান কি? উত্তর হ্যাঁ হলে ইনপুট দেওয়া দুটি সংখ্যার গুণফল বের করি এরপর ফলাফল প্রিন্ট করি উত্তর না হলে পরের ধাপে চলে যাই |
চতুর্থ শর্ত যাচাই- op এর মান কি।? উত্তর হ্যাঁ হলে ইনপুট দেওয়া দুটি সংখ্যার ভাগফল বের করি এরপর ফলাফল প্রিন্ট করি উত্তর না হলে পরের ধাপে চলে যাই |
পঞ্চম শর্ত যাচাই- op এর মান কি %? উত্তর হ্যাঁ হলে ইনপুট দেওয়া দুটি সংখ্যার মডুলাস (ভাগশেষ) বের করি এরপর ফলাফল প্রিন্ট করি উত্তর না হলে পরের ধাপে চলে যাই |
যদি কোন শর্তই পূরণ না হয়, তাহলে else এর ভিতর থাকা কাজ করব। তাই প্রিন্ট করি - Operator is incorrect. Program will crash now. এরপর আমাদের প্রোগ্রাম ক্র্যাশ করবে। |
আমাদের চূড়ান্ত সিদ্ধান্ত-
|
এখানে একটি বিষয় উল্লেখ্য, সঠিক ইনপুট দেওয়া কিন্তু খুব জরুরি যথাযথ আউটপুট পাবার জন্য। আমরা যদি ভুল ইনপুট দেই op ভ্যারিয়েবলে, তাহলে আমাদের প্রোগ্রাম ক্র্যাশ করবে ও নিচের মতো একটি তথ্য স্ক্রিনে দেখতে পাব-
এটা হচ্ছে আমাদের প্রোগ্রামে ত্রুটি হবার ঝুঁকি। প্রোগ্রাম ডিজাইনে অথবা ইনপুট প্রদানের সময় ভুল করলে এরকম বিভিন্ন সমস্যার সৃষ্টি হতে পারে।
এই প্রোগ্রাম তৈরির সময় আর কোনো ত্রুটি হবার ঝুঁকি কি আছে?
এমন কোনো ঝুঁকি খুঁজে পেলে সেটি নিচের ছকে লিখে ফেলি-
|
আমাদের আশেপাশে অনেক বাস্তব সমস্যা আছে যা কোনো শর্তের উপর নির্ভর করে ফলাফল বা সমাধান পাওয়া যায়। যেমন ধরো তুমি একটি বাগান তৈরি করছ। যদি মাটিতে পর্যাপ্ত পানি থাকে, তুমি গাছে পানি দিবে না। কিন্তু যদি মাটি শুষ্ক থাকে, তুমি গাছে পানি দিবে। অর্থাৎ মাটি শুষ্ক বা পানিতে পূর্ণ থাকার উপর গাছে পানি দেওয়া নির্ভরশীল।
আমরা এটাকে সুডো কোড হিসেবেও লিখতে পারি।
ক = মাটিতে পানির পরিমাণ
যদি ক = অল্প পানি:
গাছে পানি দিব
অথবা যদি ক = বেশি পানি:
গাছে পানি দিব না
গত কয়েকটি সেশনে আমরা পাইথন প্রোগ্রামের অনেক কিছু শিখেছি। পাইথনে কিভাবে প্রোগ্রাম লিখতে হয় তা শিখেছি, ভ্যারিয়েবল কী এবং কীভাবে ব্যবহার করতে হয় তা জেনেছি, এবং শর্ত প্রয়োগ করে প্রোগ্রাম লেখা শিখেছি। এই সেশনে আমরা প্রোগ্রামিং এর আরেকটি নতুন বিষয় সম্পর্কে শিখবো যেটি হল লুপ। আমরা তো সারাদিনে কতরকম কাজ করি। আমাদের জীবনে কি এমন কোনো কাজ আছে যেটা আমাদের বারবার করতে হয়? অনেক সময় একই কাজ বারবার করতে গেলে আমাদের একঘেয়েমিও চলে আসে। কিন্তু কিছু কাজ তবু আমাদের অনবরত করতে হয়।
যেমন- প্রতিদিন আমাদের দাঁত মাজতে হয়, স্কুলে যেতে হয়, তিনবার করে খাবার খেতে হয়, ঘুমাতে হয় আরও কত কী। এবার তাহলে এসো নিচের ছকে আমাদের প্রতিদিন করতে হয়, অর্থাৎ নিয়মিত আমাদের জীবনে পুনরাবৃত্তি ঘটে এমন কিছু কাজের তালিকা লিখে ফেলি -
আমার জীবনে বারবার ঘটে এমন কাজ |
১। দাঁত মাজা |
|
|
|
|
|
একই কাজ যখন আমরা বারবার করি আমাদের কি প্রতিবার কাজটি করা শিখে নিতে হয়? এমন কিন্তু না। আমরা একবার যদি একটি কাজ করা শিখে যাই, সেই শিক্ষা কাজে লাগিয়েই বারবার ওই একই কাজ করতে পারি, তাই না? যন্ত্রকে প্রোগ্রাম করার ব্যাপারটাও কিন্তু একইরকম। আমাদের যদি একটি প্রোগ্রামের মধ্যে একই রকমের কাজ পর পর 50 বার করতে হয়, তাহলে 50 বার সেই লাইনটি পরপর কোডে লেখার দরকার নেই। একবার লিখে সেই লাইনটিকেই নির্দিষ্ট শর্ত মেনে বারবার রান করা সম্ভব।
ধরি আমাদেরকে বলা হল। থেকে 5 পর্যন্ত প্রতিটি পূর্ণসংখ্যা প্রিন্ট করতে। আমরা চাইলে নিচের কোডটি লিখে ফেলতে পারি।
print(1) print(2) print(3) print(4) print(5) |
কিন্তু আমাদের যদি এভাবে করে। থেকে 1000 পর্যন্ত লিখতে বলা হয়? প্রতিবার একটি করে সংখ্যা প্রিন্ট করার জন্য কিন্তু আমাদেরকে 1000 লাইন লিখতে হবে! অথচ আমরা কিন্তু প্রতিবার শুধু একটি করে সংখ্যা প্রিন্ট করছি। তাহলে 1000 বার আমরা কিন্তু একই রকমের কাজ করে যাচ্ছি। অর্থাৎ এখানে একই রকমের কাজ পুনরাবৃত্তি হচ্ছে। যখন একই রকমের কাজ বারবার করতে হয় সেটি কে প্রোগ্রামিং এ সহজেই নির্দিষ্ট শর্ত মেনে ডিজাইন করা যায় লুপ (Loop) ব্যবহার করে। লুপ মানে হচ্ছে বারবার ঘটা।
পাইথনে দুই রকমের লুপ বেশি প্রচলিত-
while loop (হোয়াইল লুপ)
for loop (ফর লুপ)
এই শিখন অভিজ্ঞতায় আমরা হোয়াইল লুপ সম্পর্কে জানব এবং পরের শ্রেণিতে ফর লুপ সম্পর্কে জানতে পারব। হোয়াইল লুপে মূলত দুইটি অংশ রয়েছে
ক) শর্ত বা কন্ডিশন যদি একটি নির্দিষ্ট শর্ত পূরণ হয় তাহলে লুপের ভিতরে প্রবেশ করব। যদি শর্ত পূরণ না হয়, তাহলে লুপকে বাদ দিয়ে প্রোগ্রামের পরের অংশে চলে যাব।
খ) টাস্ক শর্ত পূরণ হলে লুপের ভিতর আমরা যা যা করব সেটি হল আমাদের টাস্ক।
আমরা এর আগে if নিয়ে কাজ করেছি পাইথনে। if এর মধ্যেও একটি নির্দিষ্ট শর্ত পূরণ হলে আমরা নির্দিষ্ট কাজ করতে পারতাম। যদি শর্ত পূরণ না হত, if এর ভিতরের কাজটি হত না। তবে if এর শর্ত পূরণ হলে একবার মাত্র কাজটি সম্পন্ন হত। হোয়াইল লুপের প্রদত্ত শর্ত পূরণ হলে একবার শুধুমাত্র কাজটি হয়ে থেমে যাবে না। বারবার আমাদের শর্তটি যাচাই হতে থাকবে। যতক্ষণ পর্যন্ত আমাদের শর্ত পূরণ হবে, অনবরত লুপটির ভিতরে বলা কাজটি হতে থাকবে। যখনই শর্ত পূরণ হবে না, লুপ থেকে আমরা প্রোগ্রামের পরের অংশে চলে যাব।
হোয়াইল লুপ কীভাবে লিখতে হয় চল ধাপগুলো দেখে নেই,
১। প্রথমে আমরা একটি ভ্যারিয়েবলের মান এসাইন করব
যেমন ধরি,
i=1
২। এরপর আমরা while লিখে আমাদের নির্দিষ্ট শর্তটি লিখে: (কোলন চিহ্ন) দিব
ধরি, । এর মান যতক্ষণ 5 এরচেয়ে ছোট হবে ততক্ষণ আমাদের লুপ চলবে। তাহলে লিখতে পারি,
while i<5:
৩। তারপর আমরা যে নির্দিষ্ট কাজ করতে চাই সেটি লিখব। যেমন আমরা যদি চাই প্রতিবার লুপের ভিতর 1 এর বর্তমান মান আমরা প্রিন্ট করব, তাহলে লিখতে পারি-
print(i)
৪। সবশেষে লুপের ভিতরে যে ভ্যারিয়েবলের মানের উপর নির্ভর করে আমরা শর্ত নির্বাচন করেছি, সেই ভ্যারিয়েবলের মান পরিবর্তন করব। ভ্যারিয়েবলের মান যদি পরিবর্তন না করি, আমাদের লুপের শর্ত আজীবন পূরণ হতে থাকবে। ফলে আমাদের লুপটি অসীম সময় চলতেই থাকবে, কখনো লুপের বাইরে আমরা যেতে পারব না। তাই আমাদেরকে অবশ্যই ভ্যারিয়েবলের মান পরিবর্তন করতে হবে।
যেমন ধরি প্রতিবার আমরা ভ্যারিয়েবলের মান। করে বাড়াতে চাই। তাহলে লিখতে পারি-
i=i+1
তাহলে আমাদের হোয়াইল লুপের পুরো সিনট্যাক্স নিচের মত দাঁড়াবে-
i-l while i<5: print(i) i=i+1 |
খেয়াল রাখতে হবে, পাইথনে লুপ লেখার সময়েও ইনডেনটেশন অনুসরণ করতে হয়। তাই আমরা while i<5: লেখার পর এই লুপের অধীনে থাকা লাইনগুলো চারঘর পরিমাণ স্পেস ফাঁকা দিয়ে লিখেছি।
এবার চল একটি কাজ করি। এই কোডের প্রতিটি ধাপে আমাদের আউটপুট কেমন হয় সেটি নিচের ছকে নিজেরা পূরণ করি-
কোডের লাইন |
i=1 |
বর্তমানে i এর মান = 1 |
আমরা তাহলে পুরো কোডটি থেকে কি আউটপুট পেয়েছি? নিচের ছকে লিখে ফেলি-
|
খেয়াল করে দেখি, আমরা। এর মান শুরু করেছিলাম। থেকে। প্রতিবার। এর মান। করে বাড়িয়েছি। আর শর্ত দিয়েছিলাম i<5 তাই। থেকে শুরু করে 5 এরচেয়ে ছোট সবগুলো পূর্ণ সংখ্যা প্রিন্ট করেছে আমাদের প্রোগাম।
এজন্য আউটপুট পেয়েছি
1
2
3
4
যদি আমরা শর্ত দিতাম i<11 তাহলে ।। এরচেয়ে ছোট সবগুলো পূর্ণ সংখ্যা প্রিন্ট হত।
চল এবারে নিচের প্রোগ্রামগুলোর আউটপুট আমরা বের করি-
প্রোগ্রাম | আউটপুট |
i-4 while i<20: print(i) i=i+4 | |
i=2024 while i>2018: print(i) i-i-1 |
এই অভিজ্ঞতার শুরুতেই আমরা জেনেছিলাম যে এই অভিজ্ঞতার শেষে আমরা প্রোগ্রামিং দিয়ে সমস্যা সমাধান করব। সেই কাজটির জন্য নিজেদের প্রস্তুত করতে আমরা প্রথমে পাইথন প্রোগ্রামিং নিয়ে কাজ করার প্রাথমিক ধারণা নিয়েছি। আজকের সেশন এবং আগামী সেশনে আমরা নিজেরাই একটি সমস্যা নির্ধারণ করে পাইথনের মাধ্যমে তা সমাধানের চেষ্টা করব।
প্রথমেই আমরা একটি সমস্যা নির্বাচন করব; যে সমস্যা সমাধান করার জন্য ইনপুট, ভ্যারিয়েবল, কন্ডিশন এবং লুপ ব্যবহার করা সম্ভব। এক্ষেত্রে দলগতভাবে আমরা কাজটি সম্পন্ন করব। শিক্ষক আমাদের ক্লাসের সবাইকে ছয়টি দলে ভাগ করে দিবেন। যেমন আমরা চাইলে ভাবতে পারি কোনো হিসাব নিকাশের কাজে নির্দিষ্ট কোনো শর্ত থাকে। আবার আমরা এটাও ভাবতে পারি কোনো হিসাব নিকাশের কাজ বার বার করতে হয়। এরকমভাবে বিভিন্নরকম পরিস্থিতি আমরা চিন্তা করতে পারি ও দলের মধ্যে আলোচনা করতে পারি। নিজেরা এরকম একটি পরিস্থিতি নির্বাচন করে তারপর আমরা কাজ করা শুরু করব।
প্রোগ্রাম ডিজাইন করার আগে প্রথমে এই সমস্যা সমাধানের জন্য একটি সুডো কোড তৈরি করি-
আমাদের দলের নির্ধারিত বাস্তব সমস্যা
|
প্রোগ্রামে যে ইনপুটগুলো নিতে হবে তার তালিকা-
|
প্রোগ্রামে কীরকম শর্ত ব্যবহার করতে হচ্ছে-
|
প্রোগ্রামে কীরকম লুপ ব্যবহার করতে হচ্ছে-
|
কী কী গাণিতিক অপারেশন করতে হবে?
|
আমাদের তৈরি করা সুডো কোড
|
এই পর্যায়ে সুডো কোড অনুসরণ করে একটি পাইথন প্রোগ্রাম ডিজাইন করি। অবশ্যই আমাদের প্রোগ্রামে in- put(), print(), if, elif, else, while, গাণিতিক অপারেশন ব্যবহার করার চেষ্টা করব।
আমাদের তৈরি করা পাইথন প্রোগ্রাম নিচের ছকে লিখে ফেলি-
|
আমাদের তৈরি করা প্রোগ্রামে যদি ভুল ইনপুট দেই তাহলে সঠিক আউটপুট বা ফলাফল পাব না। এগুলোই আমাদের প্রোগ্রামের ত্রুটি সংঘটিত হবার ঝুঁকি। প্রোগ্রাম ডিজাইনের সময়ে তাই এটাও খেয়াল রাখা জরুরি কীভাবে এরকম বিভিন্ন ঝুঁকি শনাক্ত করা যায় এবং সেটি সমাধান করা যায়।
তাই বিভিন্ন রকম ইনপুট দিয়ে আমাদের প্রোগ্রামে সেই ইনপুট অনুযায়ী কি কি সমস্যা তৈরি হয় সেটি খুঁজে বের করা দরকার।
চলো আমাদের প্রোগ্রামে আমরা ৪-৫ টি ভিন্ন রকম ইনপুট দেই এবং কিছু ভুল ইনপুটও দেই। দিয়ে যাচাই করি এক্ষেত্রে কি কি সমস্যা হচ্ছে।
ক্রম | ভুল ইনপুট | প্রোগ্রামে এর প্রভাব |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
এবারে একটি কর্মপরিকল্পনা তৈরি করা দরকার যেন আমরা এই সম্ভাব্য ত্রুটিগুলো দূর করে আমাদের প্রোগ্রাম আরও নির্ভুল করতে পারি। তাই দলের সবাই মিলে আলোচনা করি কীভাবে এই সম্ভাব্য ত্রুটি ও তার ঝুঁকি আমরা সমাধান করতে পারি।
আমাদের কর্মপরিকল্পনার মূল অংশ নিচে লিখে ফেলি-
সম্ভাব্য ঝুঁকি নিরূপণে আমাদের কর্মপরিকল্পনা-
|
প্রোগ্রামে যা পরিবর্তন আনা প্রয়োজন-
|
এবারে সেই অনুযায়ী আমাদের প্রোগ্রাম পরিবর্তন করে নতুন প্রোগ্রাম কম্পিউটারে রান করি ও নিচে লিখে ফেলি-
|
এবারে আমরা নিজেদের দলের প্রোগ্রাম অন্য আরেকটি দলের সাথে বিনিময় করব। যে দলের প্রোগ্রাম
আমরা পেলাম, তা ওই দলের নির্ধারিত বাস্তব সমস্যা সমাধানে সক্ষম কি না সেটি যাচাই করি।
পাশাপাশি এই বিষয়ে একটি সংক্ষিপ্ত প্রতিবেদন তৈরি করে ফেলি নিচের ছকগুলো পূরণ করে-
যে দলের প্রোগ্রাম যাচাই করছি তাদের নির্ধারিত সমস্যা-
|
সমাধানে দলটির ডিজাইন করা প্রোগ্রাম-
|
এই প্রোগ্রামে ব্যবহৃত বিভিন্ন ইনপুট, শর্ত, লুপের তালিকা -
|
প্রোগ্রামটি থেকে বিভিন্ন ধাপে প্রাপ্ত আউটপুট-
|
প্রোগ্রামটিতে ইনপুটের ভিন্নতায় কোনো ত্রুটি তৈরি হলে সেটি শনাক্ত করি:
|
সেই ত্রুটি মোকাবেলায় আমাদের দলের পক্ষ থেকে পরামর্শ-
|
এই প্রোগ্রামটি উক্ত নির্ধারিত সমস্যা সমাধানের জন্য কতটুকু উপযোগী সে ব্যাপারে আমাদের মতামত -
|
পুরো প্রতিবেদন তৈরি হয়ে গেলে ওই দলকে প্রতিবেদনটি বুঝিয়ে দেই এবং নিজেদের দলের প্রতিবেদন গ্রহণ করি।
তাহলে আমরা এই অভিজ্ঞতায় পাইথন দিয়ে প্রোগ্রাম ডিজাইন করা সম্পর্কে ধারণা পেলাম, একটি সমস্যা সমাধানে বিভিন্ন ইনপুট, শর্ত, লুপ দিয়ে গাণিতিক অপারেশন ব্যবহার করে প্রোগ্রাম ডিজাইন করা সম্পর্কেও জানতে পারলাম। আবার সমস্যাটি সমাধানে নানারকম ইনপুটের জন্য সম্ভাব্য আউটপুট ও সেক্ষেত্রে সম্ভাব্য ত্রুটি ঝুঁকি নির্ণয় করে সেটি সমাধান করার উপায় এবং উপযোগিতা যাচাই নিয়েও আমরা কাজ করলাম। এভাবেই আমরা প্রোগ্রামিং ব্যবহার করে বিভিন্ন সমস্যাকে সমাধান করতে পারি নিজেদের প্রয়োজনে।
আরও দেখুন...